Introduction
The COVID-19 pandemic, caused by the novel coronavirus SARS-CoV-2,
has had an unprecedented impact on global health, economies, and daily
life since its emergence in late 2019. As the world fights with the
challenges posed by this highly contagious virus, epidemiological data
have been continuously gathered and released to the public, driving
numerous researches and different approaches in trying to understand its
patterns of transmission, to identify vulnerable populations, and to
inform public health strategies. Due to the severity of the early stage
of the pandemic and its wide impact on global production, data of high
quality and accuracy were gathered in the nation through surveys and
reports, so we believed that the COVID-19 data sets could be more
informative and extensive than other epidemiology data.
In this assignment, we looked into the COVID-19 epidemiology data
sets provided by Statistics Canada along with other related data sets.
We attempted to answer three major questions in three subsections:
We wanted to find if there was a possible relationship between
the COVID pandemic and the excess mortality for 2020, 2021 and 2022.
Through this question, one might be able to draw insights on whether the
virus has had a dangerous impact on the overall public health.
We gathered data of COVID-19 long term symptom among Canadian
adults. We wanted to draw some conclusions on whether the virus had any
impact on the long-term health condition of Canadians.
We wanted to measure the relationship between the risk prevalence
and some factors like vaccination status, chronic conditions and having
or not a direct contact with people etc. By building a statistical model
between the response and predictors, it helped us understand what
procedures or conditions can affect the prevalence of COVID-19.
Method
Section 1:
Mortality
Section 2: Long-term
Impact
The data of COVID-19 long term symptom among Canadian adults contain
the major variables shown in the following table. We mainly interested
in the Measures which is the response variable. The data is grouped by
sex and age groups. The value shows the percentage of responses within
each specific group.The original data provided the confidence intervals
in the assessment of point estimates in case of high variability in the
data.
| Table (): Long Term Symptoms Data Definition |
| Variables |
Type |
Example |
Number.Unique |
PctMissing |
Comment |
| REF_DATE |
integer |
2022 |
1 |
0% |
Reference Year (2022) |
| GEO |
character |
Canada |
1 |
0% |
Geographic Location (Canada) |
| Measures |
character |
Yes, had long-term symptoms, No, did not have long-term symptoms |
2 |
0% |
Does the respondent have the long term symptoms? Yes or No. |
| Sex |
character |
Both sexes, Males |
3 |
0% |
Sex Category |
| Age.group |
character |
Ages 18 and over, Ages 18 to 34 |
5 |
0% |
Age Groups |
| Characteristics |
character |
Percent, Low 95% confidence interval, percent |
3 |
0% |
Characteristics of the value, estimate or confidence interval |
| UOM |
character |
Percent |
1 |
0% |
Unit of Measure (Percentage of the group) |
| VALUE |
numeric |
16, 14.9 |
86 |
0% |
Data Value |
| DECIMALS |
integer |
1 |
1 |
0% |
Number of Decimal Places in Value |
As the data of COVID-19 long term symptom among Canadian adults did
not contain the population size and population for each groups. We
estimate the counts from the data of Weekly number of COVID-19 cases in
Canada as of October 28, 2023. From the data of overall COVID-19 cases,
we first grouped the data to the similar structure as our Long Term
Symptom data. The data of other genders was dropped because that the
count is too small comparing to the total population.
The data is first grouped by sex which consists of “males”,
“females”, and “Both sexes”. “Both sexes” group contain the combined
data from both males and females. Then the data is further grouped by
age groups. Subgroup “Ages 18 and over” has the total count for the
corresponding sex group. The data is shown in the Table()
| Table ():Combined Data Showing Proportions and Counts by Sex and Age |
| Sex |
Age Group |
No, did not have long-term symptoms (Percent) |
Yes, had long-term symptoms (Percent) |
Count |
| Both sexes |
Ages 18 and over |
84.0 |
16.0 |
3959044 |
| Both sexes |
Ages 18 to 34 |
84.6 |
15.4 |
1506093 |
| Both sexes |
Ages 35 to 49 |
84.3 |
15.7 |
657497 |
| Both sexes |
Ages 50 to 64 |
83.3 |
16.7 |
1012269 |
| Both sexes |
Ages 65 and over |
82.2 |
17.8 |
783185 |
| Females |
Ages 18 and over |
79.9 |
20.1 |
2187574 |
| Females |
Ages 18 to 34 |
82.1 |
17.9 |
851700 |
| Females |
Ages 35 to 49 |
80.3 |
19.7 |
376243 |
| Females |
Ages 50 to 64 |
77.8 |
22.2 |
534045 |
| Females |
Ages 65 and over |
75.6 |
24.4 |
425586 |
| Males |
Ages 18 and over |
88.0 |
12.0 |
1771470 |
| Males |
Ages 18 to 34 |
87.0 |
13.0 |
654393 |
| Males |
Ages 35 to 49 |
88.3 |
11.7 |
281254 |
| Males |
Ages 50 to 64 |
88.9 |
11.1 |
478224 |
| Males |
Ages 65 and over |
89.2 |
10.8 |
357599 |
From the Table(), we find that for females, higher proportion(24.4%)
of respondents from age 65 and over reported long term symptoms. While
males from ages 18 to 34 show a higher proportion(13%) to report long
term symptoms. Overall(both sexes), higher proportion(17.8%) of adults
from ages 65 and over reported long term symptoms. For all age groups,
20.1% of females reported long term symptoms comparing to only 12% of
males.
To study the association between age groups and the long term
symptoms, A Chi-square test was conducted within each sex group. The
hypothesis of independence corresponds to \(H_0:p_{ij}=p_{i\cdot}p_{\cdot j}, \forall
i,j\). Here under each sex group, we have row variable as the age
groups, column variable as the response of long term symptoms. Counts
for specific responses “Yes, had long-term symptoms” and “No, did not
have long-term symptoms” are estimated using the corresponding
proportion and the total counts of each subgroup. Test results are shown
in the following table.
| Table():Chi-Squared Test Results of Age groups and Long term symptoms |
| Sex |
Chi-Squared Statistic |
P-Value |
| Males |
1,470.647 |
< 0.05 |
| Females |
8,591.190 |
< 0.05 |
| Both sexes |
2,477.902 |
< 0.05 |
| Table():Chi-Squared Test Results of Sex and Long term symptoms |
| Age Group |
Chi-Squared Statistic |
P-Value |
| Ages 18 to 34 |
6,688.391 |
< 0.05 |
| Ages 35 to 49 |
7,557.558 |
< 0.05 |
| Ages 50 to 64 |
22,075.524 |
< 0.05 |
| Ages 65 and over |
24,151.052 |
< 0.05 |
prop test? fisher test? G-test?
Section 3: Prevalence
Modeling
Result
Section 1:
Mortality
Section 2: Long-term
Impact
Section 3: Prevalence
Modeling
Discussion
Section 1:
Mortality
Section 2: Long-term
Impact
Section 3: Prevalence
Modeling
Conclusion
References
LS0tDQp0aXRsZTogIk1BVDUzMTcgQ2F0ZWdvcmljYWwgQXNzaWdubWVudCAyIg0KYXV0aG9yOg0KLSBUZW5nIExpKDczNzMwODYpDQotIFpoaXplIEx1KDMwMDA3NTExNCkNCi0gQ2h1dG9uZyBaaGFuZygzMDAzMTEzMjUpDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX2NhcHRpb246IHllcw0KaGVhZGVyLWluY2x1ZGVzOg0KLSBccmVuZXdjb21tYW5ke1xhbmR9e1xcfQ0KLSBcdXNlcGFja2FnZXtmbG9hdH0NCi0gXGZsb2F0cGxhY2VtZW50e2ZpZ3VyZX17SH0NCmJpYmxpb2dyYXBoeTogUmVmZXJlbmNlcy5iaWINCmxpbmstY2l0YXRpb25zOiB5ZXMNCi0tLQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLnRpdGxlLCAuYXV0aG9ye3RleHQtYWxpZ246IGNlbnRlcjt9DQpib2R5e2ZvbnQtc2l6ZTogMTJwdDt9DQp0YWJsZXtmb250LXNpemU6IDEycHQ7fQ0KaDF7Zm9udC1zaXplOiAxNHB0O30NCmgye2ZvbnQtc2l6ZTogMTJwdDt9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoYmVzdGdsbSkNCmxpYnJhcnkoZ3QpDQpsaWJyYXJ5KHN0YXJnYXplcikNCmBgYA0KDQpgYGB7cn0NCkNDQUhTPC1yZWFkLmNzdigiQ0NBSFMuY3N2IiwgaGVhZGVyID0gVFJVRSkNCkNvdmlkPC1yZWFkLmNzdigiQ292aWQuY3N2IiwgaGVhZGVyID0gVFJVRSkNCkNvdmlkX2FHPC1yZWFkLmNzdigiQ09WSURfY2FzZXMuY3N2IiwgaGVhZGVyID0gVFJVRSkNCldNb3J0YWxpdHk8LXJlYWQuY3N2KCJXZWVrbHlNb3J0YWxpdHkuY3N2IiwgaGVhZGVyID0gVFJVRSkNCkV4TW9ydGFsaXR5PC1yZWFkLmNzdigiRXhjZXNzTW9ydGFsaXR5LmNzdiIsIGhlYWRlciA9IFRSVUUpDQpMb25nVGVybTwtcmVhZC5jc3YoIkxvbmdUZXJtLmNzdiIsIGhlYWRlciA9IFRSVUUpDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVGhlIENPVklELTE5IHBhbmRlbWljLCBjYXVzZWQgYnkgdGhlIG5vdmVsIGNvcm9uYXZpcnVzIFNBUlMtQ29WLTIsIGhhcyBoYWQgYW4gdW5wcmVjZWRlbnRlZCBpbXBhY3Qgb24gZ2xvYmFsIGhlYWx0aCwgZWNvbm9taWVzLCBhbmQgZGFpbHkgbGlmZSBzaW5jZSBpdHMgZW1lcmdlbmNlIGluIGxhdGUgMjAxOS4gQXMgdGhlIHdvcmxkIGZpZ2h0cyB3aXRoIHRoZSBjaGFsbGVuZ2VzIHBvc2VkIGJ5IHRoaXMgaGlnaGx5IGNvbnRhZ2lvdXMgdmlydXMsIGVwaWRlbWlvbG9naWNhbCBkYXRhIGhhdmUgYmVlbiBjb250aW51b3VzbHkgZ2F0aGVyZWQgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMsIGRyaXZpbmcgbnVtZXJvdXMgcmVzZWFyY2hlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgaW4gdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaXRzIHBhdHRlcm5zIG9mIHRyYW5zbWlzc2lvbiwgdG8gaWRlbnRpZnkgdnVsbmVyYWJsZSBwb3B1bGF0aW9ucywgYW5kIHRvIGluZm9ybSBwdWJsaWMgaGVhbHRoIHN0cmF0ZWdpZXMuIER1ZSB0byB0aGUgc2V2ZXJpdHkgb2YgdGhlIGVhcmx5IHN0YWdlIG9mIHRoZSBwYW5kZW1pYyBhbmQgaXRzIHdpZGUgaW1wYWN0IG9uIGdsb2JhbCBwcm9kdWN0aW9uLCBkYXRhIG9mIGhpZ2ggcXVhbGl0eSBhbmQgYWNjdXJhY3kgd2VyZSBnYXRoZXJlZCBpbiB0aGUgbmF0aW9uIHRocm91Z2ggc3VydmV5cyBhbmQgcmVwb3J0cywgc28gd2UgYmVsaWV2ZWQgdGhhdCB0aGUgQ09WSUQtMTkgZGF0YSBzZXRzIGNvdWxkIGJlIG1vcmUgaW5mb3JtYXRpdmUgYW5kIGV4dGVuc2l2ZSB0aGFuIG90aGVyIGVwaWRlbWlvbG9neSBkYXRhLg0KDQpJbiB0aGlzIGFzc2lnbm1lbnQsIHdlIGxvb2tlZCBpbnRvIHRoZSBDT1ZJRC0xOSBlcGlkZW1pb2xvZ3kgZGF0YSBzZXRzIHByb3ZpZGVkIGJ5IFN0YXRpc3RpY3MgQ2FuYWRhIGFsb25nIHdpdGggb3RoZXIgcmVsYXRlZCBkYXRhIHNldHMuIFdlIGF0dGVtcHRlZCB0byBhbnN3ZXIgdGhyZWUgbWFqb3IgcXVlc3Rpb25zIGluIHRocmVlIHN1YnNlY3Rpb25zOg0KDQoxLiBXZSB3YW50ZWQgdG8gZmluZCBpZiB0aGVyZSB3YXMgYSBwb3NzaWJsZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ09WSUQgcGFuZGVtaWMgYW5kIHRoZSBleGNlc3MgbW9ydGFsaXR5IGZvciAyMDIwLCAyMDIxIGFuZCAyMDIyLiBUaHJvdWdoIHRoaXMgcXVlc3Rpb24sIG9uZSBtaWdodCBiZSBhYmxlIHRvIGRyYXcgaW5zaWdodHMgb24gd2hldGhlciB0aGUgdmlydXMgaGFzIGhhZCBhIGRhbmdlcm91cyBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgcHVibGljIGhlYWx0aC4NCg0KMi4gV2UgZ2F0aGVyZWQgZGF0YSBvZiBDT1ZJRC0xOSBsb25nIHRlcm0gc3ltcHRvbSBhbW9uZyBDYW5hZGlhbiBhZHVsdHMuIFdlIHdhbnRlZCB0byBkcmF3IHNvbWUgY29uY2x1c2lvbnMgb24gd2hldGhlciB0aGUgdmlydXMgaGFkIGFueSBpbXBhY3Qgb24gdGhlIGxvbmctdGVybSBoZWFsdGggY29uZGl0aW9uIG9mIENhbmFkaWFucy4NCg0KMy4gV2Ugd2FudGVkIHRvIG1lYXN1cmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByaXNrIHByZXZhbGVuY2UgYW5kIHNvbWUgZmFjdG9ycyBsaWtlIHZhY2NpbmF0aW9uIHN0YXR1cywgY2hyb25pYyBjb25kaXRpb25zIGFuZCBoYXZpbmcgb3Igbm90IGEgZGlyZWN0IGNvbnRhY3Qgd2l0aCBwZW9wbGUgZXRjLiBCeSBidWlsZGluZyBhIHN0YXRpc3RpY2FsIG1vZGVsIGJldHdlZW4gdGhlIHJlc3BvbnNlIGFuZCBwcmVkaWN0b3JzLCBpdCBoZWxwZWQgdXMgdW5kZXJzdGFuZCB3aGF0IHByb2NlZHVyZXMgb3IgY29uZGl0aW9ucyBjYW4gYWZmZWN0IHRoZSBwcmV2YWxlbmNlIG9mIENPVklELTE5LiAgDQoNCiMgTWV0aG9kDQoNCiMjIFNlY3Rpb24gMTogTW9ydGFsaXR5DQoNCiMjIFNlY3Rpb24gMjogTG9uZy10ZXJtIEltcGFjdA0KDQpUaGUgZGF0YSBvZiBDT1ZJRC0xOSBsb25nIHRlcm0gc3ltcHRvbSBhbW9uZyBDYW5hZGlhbiBhZHVsdHMgY29udGFpbiB0aGUgbWFqb3IgdmFyaWFibGVzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgdGFibGUuIFdlIG1haW5seSBpbnRlcmVzdGVkIGluIHRoZSBNZWFzdXJlcyB3aGljaCBpcyB0aGUgcmVzcG9uc2UgdmFyaWFibGUuIFRoZSBkYXRhIGlzIGdyb3VwZWQgYnkgc2V4IGFuZCBhZ2UgZ3JvdXBzLiBUaGUgdmFsdWUgc2hvd3MgdGhlIHBlcmNlbnRhZ2Ugb2YgcmVzcG9uc2VzIHdpdGhpbiBlYWNoIHNwZWNpZmljIGdyb3VwLlRoZSBvcmlnaW5hbCBkYXRhIHByb3ZpZGVkIHRoZSBjb25maWRlbmNlIGludGVydmFscyBpbiB0aGUgYXNzZXNzbWVudCBvZiBwb2ludCBlc3RpbWF0ZXMgaW4gY2FzZSBvZiBoaWdoIHZhcmlhYmlsaXR5IGluIHRoZSBkYXRhLiANCg0KYGBge3J9DQpEYXRhRGljdF9kYXRhIDwtIExvbmdUZXJtWyxjKDEsMiw0LDUsNiw3LDgsMTQsMTgpXQ0KDQpEYXRhRGljdDwtZGF0YS5mcmFtZSgNCiAgVmFyaWFibGVzPWNvbG5hbWVzKERhdGFEaWN0X2RhdGEpLCAgIA0KICBUeXBlPXNhcHBseShEYXRhRGljdF9kYXRhLCBmdW5jdGlvbih4KSBjbGFzcyh4KSksDQogIEV4YW1wbGU9c2FwcGx5KERhdGFEaWN0X2RhdGEsIGZ1bmN0aW9uKHgpIHBhc3RlKGFzLmNoYXJhY3RlcihoZWFkKHVuaXF1ZSh4KSwyKSksIGNvbGxhcHNlID0gIiwgIikpLA0KICBOdW1iZXIuVW5pcXVlPXNhcHBseShEYXRhRGljdF9kYXRhLCBmdW5jdGlvbih4KSBsZW5ndGgodW5pcXVlKHgpKSksDQogIFBjdE1pc3Npbmc9c2FwcGx5KERhdGFEaWN0X2RhdGEsIGZ1bmN0aW9uKHgpIHBhc3RlMChyb3VuZChzdW0oaXMubmEoeCkpL2xlbmd0aCh4KSwgNCkqMTAwLCIlIikpLA0KICBDb21tZW50PWMoIlJlZmVyZW5jZSBZZWFyICgyMDIyKSIsDQogICAgICAgICAgICAgICAgICAiR2VvZ3JhcGhpYyBMb2NhdGlvbiAoQ2FuYWRhKSIsDQogICAgICAgICAgICAgICAgICAiRG9lcyB0aGUgcmVzcG9uZGVudCBoYXZlIHRoZSBsb25nIHRlcm0gc3ltcHRvbXM/IFllcyBvciBOby4iLA0KICAgICAgICAgICAgICAgICAgIlNleCBDYXRlZ29yeSIsDQogICAgICAgICAgICAgICAgICAiQWdlIEdyb3VwcyIsDQogICAgICAgICAgICAgICAgICAiQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB2YWx1ZSwgZXN0aW1hdGUgb3IgY29uZmlkZW5jZSBpbnRlcnZhbCIsDQogICAgICAgICAgICAgICAgICAiVW5pdCBvZiBNZWFzdXJlIChQZXJjZW50YWdlIG9mIHRoZSBncm91cCkiLA0KICAgICAgICAgICAgICAgICAgIkRhdGEgVmFsdWUiLA0KICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBEZWNpbWFsIFBsYWNlcyBpbiBWYWx1ZSIpDQopDQpEYXRhRGljdCU+JWd0KCklPiV0YWJfaGVhZGVyKA0KICAgIHRpdGxlID0gIlRhYmxlICgpOiBMb25nIFRlcm0gU3ltcHRvbXMgRGF0YSBEZWZpbml0aW9uIikNCmBgYA0KDQpBcyB0aGUgZGF0YSBvZiBDT1ZJRC0xOSBsb25nIHRlcm0gc3ltcHRvbSBhbW9uZyBDYW5hZGlhbiBhZHVsdHMgZGlkIG5vdCBjb250YWluIHRoZSBwb3B1bGF0aW9uIHNpemUgYW5kIHBvcHVsYXRpb24gZm9yIGVhY2ggZ3JvdXBzLiBXZSBlc3RpbWF0ZSB0aGUgY291bnRzIGZyb20gdGhlIGRhdGEgb2YgV2Vla2x5IG51bWJlciBvZiBDT1ZJRC0xOSBjYXNlcyBpbiBDYW5hZGEgYXMgb2YgT2N0b2JlciAyOCwgMjAyMy4gRnJvbSB0aGUgZGF0YSBvZiBvdmVyYWxsIENPVklELTE5IGNhc2VzLCB3ZSBmaXJzdCBncm91cGVkIHRoZSBkYXRhIHRvIHRoZSBzaW1pbGFyIHN0cnVjdHVyZSBhcyBvdXIgTG9uZyBUZXJtIFN5bXB0b20gZGF0YS4gVGhlIGRhdGEgb2Ygb3RoZXIgZ2VuZGVycyB3YXMgZHJvcHBlZCBiZWNhdXNlIHRoYXQgdGhlIGNvdW50IGlzIHRvbyBzbWFsbCBjb21wYXJpbmcgdG8gdGhlIHRvdGFsIHBvcHVsYXRpb24uDQpgYGB7cn0NCiNncm91cCB0aGUgbG9uZ3Rlcm0gZGF0YSBhbmQgZHJvcCB2YXJpYWJsZXMgbm90IHVzZWQgaW4gdGhlIGFuYWx5c2lzDQpncm91cGVkX2RhdGEgPC0gTG9uZ1Rlcm0gJT4lDQogIGZpbHRlcihDaGFyYWN0ZXJpc3RpY3MgPT0gJ1BlcmNlbnQnKSAlPiUNCiAgZ3JvdXBfYnkoU2V4LCBBZ2UuZ3JvdXAsIE1lYXN1cmVzKSAlPiUNCiAgc3VtbWFyaXNlKFZBTFVFLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUgDQogIHNwcmVhZChNZWFzdXJlcywgVkFMVUUpDQoNCiNjbGVhbiB0aGUgY292aWQgY2FzZXMgZGF0YSBieSBhZ2UgYW5kIGdlbmRlcg0KY2xlYW5lZF9kYXRhIDwtIENvdmlkX2FHICU+JQ0KICBzZWxlY3QoLXJhdGVfcGVyXzEwMDAwMCkgJT4lDQogIGZpbHRlcihzdGF0dXMgIT0gJ2RlYXRocycsIA0KICAgICAgICAgYWdlX2dyb3VwICE9ICdhbGwnLCANCiAgICAgICAgIGdlbmRlciAhPSAnYWxsJywNCiAgICAgICAgIGdlbmRlciAhPSAnb3RoZXInKSAlPiUNCiAgbmEub21pdCgpDQoNCiNtYXRjaCB0aGUgYWdlIGdyb3VwcyBjYXRlZ29yaWVzIHdpdGggbG9uZ3Rlcm0NCm1hcF9hZ2VfZ3JvdXAgPC0gZnVuY3Rpb24oYWdlX2dyb3VwKSB7DQogIGNhc2Vfd2hlbigNCiAgICBhZ2VfZ3JvdXAgJWluJSBjKCIyMCB0byAyOSIsICIzMCB0byAzOSIpIH4gIkFnZXMgMTggdG8gMzQiLA0KICAgIGFnZV9ncm91cCAlaW4lIGMoIjQwIHRvIDQ5IikgfiAiQWdlcyAzNSB0byA0OSIsDQogICAgYWdlX2dyb3VwICVpbiUgYygiNTAgdG8gNTkiLCAiNjAgdG8gNjkiKSB+ICJBZ2VzIDUwIHRvIDY0IiwNCiAgICBhZ2VfZ3JvdXAgJWluJSBjKCI3MCB0byA3OSIsICI4MCsiKSB+ICJBZ2VzIDY1IGFuZCBvdmVyIiwNCiAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyANCiAgKQ0KfQ0KDQojbWF0Y2ggdGhlIHNleCBjYXRlZ29yaWVzDQpzdW1tYXJ5X2RhdGEgPC0gY2xlYW5lZF9kYXRhICU+JQ0KICBtdXRhdGUoYWdlX2dyb3VwID0gbWFwX2FnZV9ncm91cChhZ2VfZ3JvdXApKSAlPiUNCiAgbXV0YXRlKGdlbmRlciA9IGNhc2Vfd2hlbigNCiAgICBnZW5kZXIgPT0gJ21hbGUnIH4gJ01hbGVzJywNCiAgICBnZW5kZXIgPT0gJ2ZlbWFsZScgfiAnRmVtYWxlcycsDQogICAgVFJVRSB+IGdlbmRlcg0KICApKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShhZ2VfZ3JvdXApKSAlPiUNCiAgZ3JvdXBfYnkoZ2VuZGVyLGFnZV9ncm91cCkgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCksIC5ncm91cHMgPSAnZHJvcCcpDQoNCiN0b3RhbCBmb3IgYWdlcw0KYWdlc18xOF9hbmRfb3ZlciA8LSBzdW1tYXJ5X2RhdGEgJT4lDQogIGdyb3VwX2J5KGdlbmRlcikgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICBtdXRhdGUoYWdlX2dyb3VwID0gJ0FnZXMgMTggYW5kIG92ZXInKQ0KDQpzdW1tYXJ5X2RhdGEgPC0gYmluZF9yb3dzKHN1bW1hcnlfZGF0YSwgYWdlc18xOF9hbmRfb3ZlcikNCg0KI2JvdGggc2V4ZXMNCmJvdGhfc2V4ZXNfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lDQogIGZpbHRlcihnZW5kZXIgJWluJSBjKCdNYWxlcycsICdGZW1hbGVzJykpICU+JQ0KICBncm91cF9ieShhZ2VfZ3JvdXApICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgbXV0YXRlKGdlbmRlciA9ICdCb3RoIHNleGVzJykNCg0KZmluYWxfc3VtbWFyeV9kYXRhIDwtIHJiaW5kKHN1bW1hcnlfZGF0YSwgYm90aF9zZXhlc19kYXRhKQ0KZmluYWxfc3VtbWFyeV9kYXRhIDwtIGZpbmFsX3N1bW1hcnlfZGF0YSAlPiUNCiAgYXJyYW5nZShnZW5kZXIsIGFnZV9ncm91cCkgJT4lDQogIHJlbmFtZShTZXggPSBnZW5kZXIsIEFnZS5ncm91cCA9IGFnZV9ncm91cCkNCg0KI2NvbWJpbmUgbG9uZ3Rlcm0gcHJvcG9ydGlvbiBkYXRhIHdpdGggdGhlIGdyb3VwIGNvdW50cw0KY29tYmluZWRfZGF0YSA8LSBsZWZ0X2pvaW4oZ3JvdXBlZF9kYXRhLCBmaW5hbF9zdW1tYXJ5X2RhdGEsIGJ5ID0gYygiU2V4IiwgIkFnZS5ncm91cCIpKQ0KYGBgDQoNClRoZSBkYXRhIGlzIGZpcnN0IGdyb3VwZWQgYnkgc2V4IHdoaWNoIGNvbnNpc3RzIG9mICJtYWxlcyIsICJmZW1hbGVzIiwgYW5kICJCb3RoIHNleGVzIi4gIkJvdGggc2V4ZXMiIGdyb3VwIGNvbnRhaW4gdGhlIGNvbWJpbmVkIGRhdGEgZnJvbSBib3RoIG1hbGVzIGFuZCBmZW1hbGVzLiBUaGVuIHRoZSBkYXRhIGlzIGZ1cnRoZXIgZ3JvdXBlZCBieSBhZ2UgZ3JvdXBzLiBTdWJncm91cCAiQWdlcyAxOCBhbmQgb3ZlciIgaGFzIHRoZSB0b3RhbCBjb3VudCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc2V4IGdyb3VwLiBUaGUgZGF0YSBpcyBzaG93biBpbiB0aGUgVGFibGUoKQ0KYGBge3J9DQpndF90YWJsZSA8LSBjb21iaW5lZF9kYXRhICU+JQ0KICBndCgpICU+JQ0KICB0YWJfaGVhZGVyKA0KICAgIHRpdGxlID0gbWQoIioqVGFibGUgKCk6Q29tYmluZWQgRGF0YSBTaG93aW5nIFByb3BvcnRpb25zIGFuZCBDb3VudHMgYnkgU2V4IGFuZCBBZ2UqKiIpDQogICkgJT4lDQogIGNvbHNfbGFiZWwoDQogICAgU2V4ID0gIlNleCIsDQogICAgYEFnZS5ncm91cGAgPSAiQWdlIEdyb3VwIiwNCiAgICBgWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zYCA9ICJZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXMgKFBlcmNlbnQpIiwNCiAgICBgTm8sIGRpZCBub3QgaGF2ZSBsb25nLXRlcm0gc3ltcHRvbXNgID0gIk5vLCBkaWQgbm90IGhhdmUgbG9uZy10ZXJtIHN5bXB0b21zIChQZXJjZW50KSIsDQogICAgY291bnQgPSAiQ291bnQiDQogICkgJT4lDQogIHRhYl9zdHlsZSgNCiAgICBzdHlsZSA9IGxpc3QoDQogICAgICBjZWxsX2JvcmRlcnMoc2lkZXMgPSAiYm90dG9tIiwgd2VpZ2h0ID0gcHgoMikpDQogICAgKSwNCiAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KA0KICAgICAgcm93cyA9IGNvbWJpbmVkX2RhdGEkU2V4ICE9IGRwbHlyOjpsZWFkKGNvbWJpbmVkX2RhdGEkU2V4KQ0KICAgICkNCiAgKSAlPiUNCiAgdGFiX3N0eWxlKA0KICAgIHN0eWxlID0gbGlzdCgNCiAgICAgIGNlbGxfZmlsbChjb2xvciA9ICJsaWdodGdyZXkiKSwgDQogICAgICBjZWxsX3RleHQod2VpZ2h0ID0gImJvbGQiKQ0KICAgICksDQogICAgbG9jYXRpb25zID0gY2VsbHNfY29sdW1uX2xhYmVscyhjb2x1bW5zID0gVFJVRSkNCiAgKSAlPiUNCiAgdGFiX3N0eWxlKA0KICAgIHN0eWxlID0gY2VsbF90ZXh0KGFsaWduID0gImNlbnRlciIpLCANCiAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBjKDMsNCkpDQogICkNCg0KaW52aXNpYmxlKHByaW50KGd0X3RhYmxlKSkNCmBgYA0KRnJvbSB0aGUgVGFibGUoKSwgd2UgZmluZCB0aGF0IGZvciBmZW1hbGVzLCBoaWdoZXIgcHJvcG9ydGlvbigyNC40JSkgb2YgcmVzcG9uZGVudHMgZnJvbSBhZ2UgNjUgYW5kIG92ZXIgcmVwb3J0ZWQgbG9uZyB0ZXJtIHN5bXB0b21zLiBXaGlsZSBtYWxlcyBmcm9tIGFnZXMgMTggdG8gMzQgc2hvdyBhIGhpZ2hlciBwcm9wb3J0aW9uKDEzJSkgdG8gcmVwb3J0IGxvbmcgdGVybSBzeW1wdG9tcy4gT3ZlcmFsbChib3RoIHNleGVzKSwgaGlnaGVyIHByb3BvcnRpb24oMTcuOCUpIG9mIGFkdWx0cyBmcm9tIGFnZXMgNjUgYW5kIG92ZXIgcmVwb3J0ZWQgbG9uZyB0ZXJtIHN5bXB0b21zLiBGb3IgYWxsIGFnZSBncm91cHMsIDIwLjElIG9mIGZlbWFsZXMgcmVwb3J0ZWQgbG9uZyB0ZXJtIHN5bXB0b21zIGNvbXBhcmluZyB0byBvbmx5IDEyJSBvZiBtYWxlcy4NCg0KVG8gc3R1ZHkgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYWdlIGdyb3VwcyBhbmQgdGhlIGxvbmcgdGVybSBzeW1wdG9tcywgQSBDaGktc3F1YXJlIHRlc3Qgd2FzIGNvbmR1Y3RlZCB3aXRoaW4gZWFjaCBzZXggZ3JvdXAuIFRoZSBoeXBvdGhlc2lzIG9mIGluZGVwZW5kZW5jZSBjb3JyZXNwb25kcyB0byAkSF8wOnBfe2lqfT1wX3tpXGNkb3R9cF97XGNkb3Qgan0sIFxmb3JhbGwgaSxqJC4gSGVyZSB1bmRlciBlYWNoIHNleCBncm91cCwgd2UgaGF2ZSByb3cgdmFyaWFibGUgYXMgdGhlIGFnZSBncm91cHMsICBjb2x1bW4gdmFyaWFibGUgYXMgdGhlIHJlc3BvbnNlIG9mIGxvbmcgdGVybSBzeW1wdG9tcy4gQ291bnRzIGZvciBzcGVjaWZpYyByZXNwb25zZXMgIlllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tcyIgYW5kICJObywgZGlkIG5vdCBoYXZlIGxvbmctdGVybSBzeW1wdG9tcyIgYXJlIGVzdGltYXRlZCB1c2luZyB0aGUgY29ycmVzcG9uZGluZyBwcm9wb3J0aW9uIGFuZCB0aGUgdG90YWwgY291bnRzIG9mIGVhY2ggc3ViZ3JvdXAuIFRlc3QgcmVzdWx0cyBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4NCmBgYHtyfQ0KbGlicmFyeShicm9vbSkNCnBlcmZvcm1fY2hpX3NxdWFyZTEgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBmaWx0ZXJlZF9kYXRhIDwtIGZpbHRlcihkYXRhLCBgQWdlLmdyb3VwYCAhPSAiQWdlcyAxOCBhbmQgb3ZlciIpDQoNCiAgY29udGluZ2VuY3lfdGFibGUgPC0gZmlsdGVyZWRfZGF0YSAlPiUNCiAgICBzZWxlY3QoYEFnZS5ncm91cGAsIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgLCBjb3VudCkgJT4lDQogICAgbXV0YXRlKE5vID0gKDEwMCAtIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgKSAqIGNvdW50IC8gMTAwLA0KICAgICAgICAgICBZZXMgPSBgWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zYCAqIGNvdW50IC8gMTAwKSAlPiUNCiAgICBzZWxlY3QoLWBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgKSAlPiUNCiAgICBncm91cF9ieShgQWdlLmdyb3VwYCkNCg0KICBjaGlfc3F1YXJlX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlWy0xXSkNCiAgDQogIHJldHVybihjaGlfc3F1YXJlX3Jlc3VsdCkNCn0NCg0KcmVzdWx0czEgPC0gbGlzdCgpDQpzZXhlcyA8LSBjKCJNYWxlcyIsICJGZW1hbGVzIiwgIkJvdGggc2V4ZXMiKQ0KZm9yIChzZXggaW4gc2V4ZXMpIHsNCiAgZmlsdGVyZWRfZGF0YSA8LSBjb21iaW5lZF9kYXRhICU+JSBmaWx0ZXIoU2V4ID09IHNleCkNCiAgcmVzdWx0czFbW3NleF1dIDwtIHBlcmZvcm1fY2hpX3NxdWFyZTEoZmlsdGVyZWRfZGF0YSkNCn0NCg0KdGVzdF9yZXN1bHRzMSA8LSBsYXBwbHkocmVzdWx0czEsIHRpZHkpICU+JSBiaW5kX3Jvd3MoKSAlPiUgbXV0YXRlKFNleCA9IHNleGVzKQ0KdGVzdF9yZXN1bHRzMSA8LSBzZWxlY3QodGVzdF9yZXN1bHRzMSwgU2V4LCBzdGF0aXN0aWMsIHAudmFsdWUpDQoNCnNpZ25pZmljYW5jZV9sZXZlbCA8LSAwLjA1DQoNCnJlc3VsdF90YWJsZTEgPC0gdGVzdF9yZXN1bHRzMSAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IG1kKCIqKlRhYmxlKCk6Q2hpLVNxdWFyZWQgVGVzdCBSZXN1bHRzIG9mIEFnZSBncm91cHMgYW5kIExvbmcgdGVybSBzeW1wdG9tcyoqIikNCiAgKSAlPiUNCiAgY29sc19sYWJlbCgNCiAgICBTZXggPSAiU2V4IiwNCiAgICBzdGF0aXN0aWMgPSAiQ2hpLVNxdWFyZWQgU3RhdGlzdGljIiwNCiAgICBwLnZhbHVlID0gIlAtVmFsdWUiDQogICkgJT4lDQogIGZtdF9udW1iZXIoDQogICAgY29sdW1ucyA9IHZhcnMoc3RhdGlzdGljLCBwLnZhbHVlKSwNCiAgICBkZWNpbWFscyA9IDMNCiAgKSAlPiUNCiAgZm10KA0KICAgIGNvbHVtbnMgPSB2YXJzKHAudmFsdWUpLA0KICAgIGZucyA9IGZ1bmN0aW9uKHgpIHsNCiAgICAgIGlmZWxzZSh4IDwgc2lnbmlmaWNhbmNlX2xldmVsLCBwYXN0ZSgiPCIsIHNpZ25pZmljYW5jZV9sZXZlbCksIHNwcmludGYoIiUuM2YiLCB4KSkNCiAgICB9DQogICkNCg0KaW52aXNpYmxlKHByaW50KHJlc3VsdF90YWJsZTEpKQ0KYGBgDQpgYGB7cn0NCnBlcmZvcm1fY2hpX3NxdWFyZTIgPC0gZnVuY3Rpb24oZGF0YSwgYWdlX2dyb3VwKSB7DQogIGZpbHRlcmVkX2RhdGEgPC0gZGF0YSAlPiUNCiAgICBmaWx0ZXIoYEFnZS5ncm91cGAgPT0gYWdlX2dyb3VwLCBTZXggIT0gIkJvdGggc2V4ZXMiKQ0KDQogIGNvbnRpbmdlbmN5X3RhYmxlIDwtIGZpbHRlcmVkX2RhdGEgJT4lDQogICAgc2VsZWN0KFNleCwgYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2AsIGNvdW50KSAlPiUNCiAgICBtdXRhdGUoTm8gPSAoMTAwIC0gYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2ApICogY291bnQgLyAxMDAsDQogICAgICAgICAgIFllcyA9IGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgICogY291bnQgLyAxMDApICU+JQ0KICAgIHNlbGVjdCgtYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2ApICU+JQ0KICAgIGdyb3VwX2J5KFNleCkgJT4lDQogICAgc3VtbWFyaXNlKE5vID0gc3VtKE5vKSwgWWVzID0gc3VtKFllcykpDQoNCiAgY2hpX3NxdWFyZV9yZXN1bHQgPC0gY2hpc3EudGVzdChjb250aW5nZW5jeV90YWJsZVstMV0pDQoNCiAgcmV0dXJuKGNoaV9zcXVhcmVfcmVzdWx0KQ0KfQ0KDQphZ2VfZ3JvdXBzIDwtIHVuaXF1ZShjb21iaW5lZF9kYXRhJGBBZ2UuZ3JvdXBgW2NvbWJpbmVkX2RhdGEkYEFnZS5ncm91cGAgIT0gIkFnZXMgMTggYW5kIG92ZXIiXSkNCg0KcmVzdWx0czIgPC0gbGlzdCgpDQpmb3IgKGFnZV9ncm91cCBpbiBhZ2VfZ3JvdXBzKSB7DQogIHJlc3VsdHMyW1thZ2VfZ3JvdXBdXSA8LSBwZXJmb3JtX2NoaV9zcXVhcmUyKGNvbWJpbmVkX2RhdGEsIGFnZV9ncm91cCkNCn0NCg0KdGVzdF9yZXN1bHRzMiA8LSBsYXBwbHkocmVzdWx0czIsIHRpZHkpICU+JSBiaW5kX3Jvd3MoKSAlPiUgbXV0YXRlKGBBZ2UuZ3JvdXBgID0gYWdlX2dyb3VwcykNCnRlc3RfcmVzdWx0czIgPC0gc2VsZWN0KHRlc3RfcmVzdWx0czIsIGBBZ2UuZ3JvdXBgLCBzdGF0aXN0aWMsIHAudmFsdWUpDQoNCnJlc3VsdF90YWJsZTIgPC0gdGVzdF9yZXN1bHRzMiAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IG1kKCIqKlRhYmxlKCk6Q2hpLVNxdWFyZWQgVGVzdCBSZXN1bHRzIG9mIFNleCBhbmQgTG9uZyB0ZXJtIHN5bXB0b21zKioiKQ0KICApICU+JQ0KICBjb2xzX2xhYmVsKA0KICAgIGBBZ2UuZ3JvdXBgID0gIkFnZSBHcm91cCIsDQogICAgc3RhdGlzdGljID0gIkNoaS1TcXVhcmVkIFN0YXRpc3RpYyIsDQogICAgcC52YWx1ZSA9ICJQLVZhbHVlIg0KICApICU+JQ0KICBmbXRfbnVtYmVyKA0KICAgIGNvbHVtbnMgPSB2YXJzKHN0YXRpc3RpYyksDQogICAgZGVjaW1hbHMgPSAzDQogICkgJT4lDQogIGZtdCgNCiAgICBjb2x1bW5zID0gdmFycyhwLnZhbHVlKSwNCiAgICBmbnMgPSBmdW5jdGlvbih4KSB7DQogICAgICBpZmVsc2UoeCA8IDAuMDUsIHBhc3RlKCI8IDAuMDUiKSwgc3ByaW50ZigiJS4zZiIsIHgpKQ0KICAgIH0NCiAgKQ0KDQppbnZpc2libGUocHJpbnQocmVzdWx0X3RhYmxlMikpDQpgYGANCnByb3AgdGVzdD8gZmlzaGVyIHRlc3Q/IEctdGVzdD8NCg0KIyMgU2VjdGlvbiAzOiBQcmV2YWxlbmNlIE1vZGVsaW5nDQoNCiMgUmVzdWx0DQoNCiMjIFNlY3Rpb24gMTogTW9ydGFsaXR5DQoNCiMjIFNlY3Rpb24gMjogTG9uZy10ZXJtIEltcGFjdA0KDQojIyBTZWN0aW9uIDM6IFByZXZhbGVuY2UgTW9kZWxpbmcNCg0KYGBge3J9DQpXTW9ydGFsaXR5JT4lbXV0YXRlKFllYXI9eWVhcihSRUZfREFURSksIFdlZWs9c3Vic3RyKFJFRl9EQVRFLDYsMTApKSU+JW11dGF0ZShZZWFyPWZhY3RvcihZZWFyKSklPiVmaWx0ZXIoQWdlLmF0LnRpbWUub2YuZGVhdGg9PSJBZ2UgYXQgdGltZSBvZiBkZWF0aCwgYWxsIGFnZXMiICYgU2V4PT0iQm90aCBzZXhlcyIgJiBHRU89PSJDYW5hZGEsIHBsYWNlIG9mIG9jY3VycmVuY2UiKSU+JQ0KICBwbG90X2x5KHg9fldlZWssIHk9flZBTFVFLCBjb2xvcj1+WWVhcix0eXBlID0gInNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIpDQpgYGANCg0KIyBEaXNjdXNzaW9uDQoNCiMjIFNlY3Rpb24gMTogTW9ydGFsaXR5DQoNCiMjIFNlY3Rpb24gMjogTG9uZy10ZXJtIEltcGFjdA0KDQojIyBTZWN0aW9uIDM6IFByZXZhbGVuY2UgTW9kZWxpbmcNCg0KIyBDb25jbHVzaW9uDQoNCiMgUmVmZXJlbmNlcw0K